UNPKG

angular-cesium

Version:
186 lines 29.8 kB
import { KeyboardAction } from '../../models/ac-keyboard-action.enum'; const CAMERA_MOVEMENT_DEFAULT_FACTOR = 100.0; const CAMERA_LOOK_DEFAULT_FACTOR = 0.01; const CAMERA_TWIST_DEFAULT_FACTOR = 0.01; const CAMERA_ROTATE_DEFAULT_FACTOR = 0.01; export const PREDEFINED_KEYBOARD_ACTIONS = { /** * Moves the camera forward, accepts a numeric parameter named `moveRate` that controls * the factor of movement, according to the camera height. */ [KeyboardAction.CAMERA_FORWARD]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const scene = cesiumService.getScene(); const cameraHeight = scene.globe.ellipsoid.cartesianToCartographic(camera.position).height; const moveRate = cameraHeight / (params.moveRate || CAMERA_MOVEMENT_DEFAULT_FACTOR); camera.moveForward(moveRate); }, /** * Moves the camera backward, accepts a numeric parameter named `moveRate` that controls * the factor of movement, according to the camera height. */ [KeyboardAction.CAMERA_BACKWARD]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const scene = cesiumService.getScene(); const cameraHeight = scene.globe.ellipsoid.cartesianToCartographic(camera.position).height; const moveRate = cameraHeight / (params.moveRate || CAMERA_MOVEMENT_DEFAULT_FACTOR); camera.moveBackward(moveRate); }, /** * Moves the camera up, accepts a numeric parameter named `moveRate` that controls * the factor of movement, according to the camera height. */ [KeyboardAction.CAMERA_UP]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const scene = cesiumService.getScene(); const cameraHeight = scene.globe.ellipsoid.cartesianToCartographic(camera.position).height; const moveRate = cameraHeight / (params.moveRate || CAMERA_MOVEMENT_DEFAULT_FACTOR); camera.moveUp(moveRate); }, /** * Moves the camera down, accepts a numeric parameter named `moveRate` that controls * the factor of movement, according to the camera height. */ [KeyboardAction.CAMERA_DOWN]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const scene = cesiumService.getScene(); const cameraHeight = scene.globe.ellipsoid.cartesianToCartographic(camera.position).height; const moveRate = cameraHeight / (params.moveRate || CAMERA_MOVEMENT_DEFAULT_FACTOR); camera.moveDown(moveRate); }, /** * Moves the camera right, accepts a numeric parameter named `moveRate` that controls * the factor of movement, according to the camera height. */ [KeyboardAction.CAMERA_RIGHT]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const scene = cesiumService.getScene(); const cameraHeight = scene.globe.ellipsoid.cartesianToCartographic(camera.position).height; const moveRate = cameraHeight / (params.moveRate || CAMERA_MOVEMENT_DEFAULT_FACTOR); camera.moveRight(moveRate); }, /** * Moves the camera left, accepts a numeric parameter named `moveRate` that controls * the factor of movement, according to the camera height. */ [KeyboardAction.CAMERA_LEFT]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const scene = cesiumService.getScene(); const cameraHeight = scene.globe.ellipsoid.cartesianToCartographic(camera.position).height; const moveRate = cameraHeight / (params.moveRate || CAMERA_MOVEMENT_DEFAULT_FACTOR); camera.moveLeft(moveRate); }, /** * Changes the camera to look to the right, accepts a numeric parameter named `lookFactor` that controls * the factor of looking, according to the camera current position. */ [KeyboardAction.CAMERA_LOOK_RIGHT]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const currentPosition = camera.positionCartographic; const lookFactor = params.lookFactor || CAMERA_LOOK_DEFAULT_FACTOR; camera.lookRight(currentPosition.latitude * lookFactor); }, /** * Changes the camera to look to the left, accepts a numeric parameter named `lookFactor` that controls * the factor of looking, according to the camera current position. */ [KeyboardAction.CAMERA_LOOK_LEFT]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const currentPosition = camera.positionCartographic; const lookFactor = params.lookFactor || CAMERA_LOOK_DEFAULT_FACTOR; camera.lookLeft(currentPosition.latitude * lookFactor); }, /** * Changes the camera to look up, accepts a numeric parameter named `lookFactor` that controls * the factor of looking, according to the camera current position. */ [KeyboardAction.CAMERA_LOOK_UP]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const currentPosition = camera.positionCartographic; const lookFactor = params.lookFactor || CAMERA_LOOK_DEFAULT_FACTOR; camera.lookUp(currentPosition.longitude * (lookFactor * -1)); }, /** * Changes the camera to look down, accepts a numeric parameter named `lookFactor` that controls * the factor of looking, according to the camera current position. */ [KeyboardAction.CAMERA_LOOK_DOWN]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const currentPosition = camera.positionCartographic; const lookFactor = params.lookFactor || CAMERA_LOOK_DEFAULT_FACTOR; camera.lookDown(currentPosition.longitude * (lookFactor * -1)); }, /** * Twists the camera to the right, accepts a numeric parameter named `amount` that controls * the twist amount */ [KeyboardAction.CAMERA_TWIST_RIGHT]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const lookFactor = params.amount || CAMERA_TWIST_DEFAULT_FACTOR; camera.twistRight(lookFactor); }, /** * Twists the camera to the left, accepts a numeric parameter named `amount` that controls * the twist amount */ [KeyboardAction.CAMERA_TWIST_LEFT]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const lookFactor = params.amount || CAMERA_TWIST_DEFAULT_FACTOR; camera.twistLeft(lookFactor); }, /** * Rotates the camera to the right, accepts a numeric parameter named `angle` that controls * the rotation angle */ [KeyboardAction.CAMERA_ROTATE_RIGHT]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const lookFactor = params.angle || CAMERA_ROTATE_DEFAULT_FACTOR; camera.rotateRight(lookFactor); }, /** * Rotates the camera to the left, accepts a numeric parameter named `angle` that controls * the rotation angle */ [KeyboardAction.CAMERA_ROTATE_LEFT]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const lookFactor = params.angle || CAMERA_ROTATE_DEFAULT_FACTOR; camera.rotateLeft(lookFactor); }, /** * Rotates the camera upwards, accepts a numeric parameter named `angle` that controls * the rotation angle */ [KeyboardAction.CAMERA_ROTATE_UP]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const lookFactor = params.angle || CAMERA_ROTATE_DEFAULT_FACTOR; camera.rotateUp(lookFactor); }, /** * Rotates the camera downwards, accepts a numeric parameter named `angle` that controls * the rotation angle */ [KeyboardAction.CAMERA_ROTATE_DOWN]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const lookFactor = params.angle || CAMERA_ROTATE_DEFAULT_FACTOR; camera.rotateDown(lookFactor); }, /** * Zoom in into the current camera center position, accepts a numeric parameter named * `amount` that controls the amount of zoom in meters. */ [KeyboardAction.CAMERA_ZOOM_IN]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const amount = params.amount; camera.zoomIn(amount); }, /** * Zoom out from the current camera center position, accepts a numeric parameter named * `amount` that controls the amount of zoom in meters. */ [KeyboardAction.CAMERA_ZOOM_OUT]: (cesiumService, params) => { const camera = cesiumService.getViewer().camera; const amount = params.amount; camera.zoomOut(amount); }, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZGVmaW5lZC1hY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jZXNpdW0vc3JjL2xpYi9hbmd1bGFyLWNlc2l1bS9zZXJ2aWNlcy9rZXlib2FyZC1jb250cm9sL3ByZWRlZmluZWQtYWN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFJdEUsTUFBTSw4QkFBOEIsR0FBRyxLQUFLLENBQUM7QUFDN0MsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUM7QUFDeEMsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLENBQUM7QUFDekMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7QUFFMUMsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQStDO0lBQ3JGOzs7T0FHRztJQUNILENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsYUFBNEIsRUFBRSxNQUFXLEVBQUUsRUFBRTtRQUM3RSxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2hELE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzNGLE1BQU0sUUFBUSxHQUFHLFlBQVksR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksOEJBQThCLENBQUMsQ0FBQztRQUNwRixNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFDRDs7O09BR0c7SUFDSCxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLGFBQTRCLEVBQUUsTUFBVyxFQUFFLEVB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TUFBTSxHQUFHLGFBQWEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDaEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSw0QkFBNEIsQ0FBQztRQUNoRSxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRDs7O09BR0c7SUFDSCxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGFBQTRCLEVBQUUsTUFBVyxFQUFFLEVBQUU7UUFDN0UsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUNEOzs7T0FHRztJQUNILENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsYUFBNEIsRUFBRSxNQUFXLEVBQUUsRUFBRTtRQUM5RSxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2hELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDN0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEtleWJvYXJkQWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjLWtleWJvYXJkLWFjdGlvbi5lbnVtJztcclxuaW1wb3J0IHsgS2V5Ym9hcmRDb250cm9sQWN0aW9uRm4gfSBmcm9tICcuL2tleWJvYXJkLWNvbnRyb2wuc2VydmljZSc7XHJcbmltcG9ydCB7IENlc2l1bVNlcnZpY2UgfSBmcm9tICcuLi9jZXNpdW0vY2VzaXVtLnNlcnZpY2UnO1xyXG5cclxuY29uc3QgQ0FNRVJBX01PVkVNRU5UX0RFRkFVTFRfRkFDVE9SID0gMTAwLjA7XHJcbmNvbnN0IENBTUVSQV9MT09LX0RFRkFVTFRfRkFDVE9SID0gMC4wMTtcclxuY29uc3QgQ0FNRVJBX1RXSVNUX0RFRkFVTFRfRkFDVE9SID0gMC4wMTtcclxuY29uc3QgQ0FNRVJBX1JPVEFURV9ERUZBVUxUX0ZBQ1RPUiA9IDAuMDE7XHJcblxyXG5leHBvcnQgY29uc3QgUFJFREVGSU5FRF9LRVlCT0FSRF9BQ1RJT05TOiB7IFtrZXk6IG51bWJlcl06IEtleWJvYXJkQ29udHJvbEFjdGlvbkZuIH0gPSB7XHJcbiAgLyoqXHJcbiAgICogTW92ZXMgdGhlIGNhbWVyYSBmb3J3YXJkLCBhY2NlcHRzIGEgbnVtZXJpYyBwYXJhbWV0ZXIgbmFtZWQgYG1vdmVSYXRlYCB0aGF0IGNvbnRyb2xzXHJcbiAgICogdGhlIGZhY3RvciBvZiBtb3ZlbWVudCwgYWNjb3JkaW5nIHRvIHRoZSBjYW1lcmEgaGVpZ2h0LlxyXG4gICAqL1xyXG4gIFtLZXlib2FyZEFjdGlvbi5DQU1FUkFfRk9SV0FSRF06IChjZXNpdW1TZXJ2aWNlOiBDZXNpdW1TZXJ2aWNlLCBwYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgY2FtZXJhID0gY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKS5jYW1lcmE7XHJcbiAgICBjb25zdCBzY2VuZSA9IGNlc2l1bVNlcnZpY2UuZ2V0U2NlbmUoKTtcclxuICAgIGNvbnN0IGNhbWVyYUhlaWdodCA9IHNjZW5lLmdsb2JlLmVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhjYW1lcmEucG9zaXRpb24pLmhlaWdodDtcclxuICAgIGNvbnN0IG1vdmVSYXRlID0gY2FtZXJhSGVpZ2h0IC8gKHBhcmFtcy5tb3ZlUmF0ZSB8fCBDQU1FUkFfTU9WRU1FTlRfREVGQVVMVF9GQUNUT1IpO1xyXG4gICAgY2FtZXJhLm1vdmVGb3J3YXJkKG1vdmVSYXRlKTtcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIE1vdmVzIHRoZSBjYW1lcmEgYmFja3dhcmQsIGFjY2VwdHMgYSBudW1lcmljIHBhcmFtZXRlciBuYW1lZCBgbW92ZVJhdGVgIHRoYXQgY29udHJvbHNcclxuICAgKiB0aGUgZmFjdG9yIG9mIG1vdmVtZW50LCBhY2NvcmRpbmcgdG8gdGhlIGNhbWVyYSBoZWlnaHQuXHJcbiAgICovXHJcbiAgW0tleWJvYXJkQWN0aW9uLkNBTUVSQV9CQUNLV0FSRF06IChjZXNpdW1TZXJ2aWNlOiBDZXNpdW1TZXJ2aWNlLCBwYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgY2FtZXJhID0gY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKS5jYW1lcmE7XHJcbiAgICBjb25zdCBzY2VuZSA9IGNlc2l1bVNlcnZpY2UuZ2V0U2NlbmUoKTtcclxuICAgIGNvbnN0IGNhbWVyYUhlaWdodCA9IHNjZW5lLmdsb2JlLmVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhjYW1lcmEucG9zaXRpb24pLmhlaWdodDtcclxuICAgIGNvbnN0IG1vdmVSYXRlID0gY2FtZXJhSGVpZ2h0IC8gKHBhcmFtcy5tb3ZlUmF0ZSB8fCBDQU1FUkFfTU9WRU1FTlRfREVGQVVMVF9GQUNUT1IpO1xyXG4gICAgY2FtZXJhLm1vdmVCYWNrd2FyZChtb3ZlUmF0ZSk7XHJcbiAgfSxcclxuICAvKipcclxuICAgKiBNb3ZlcyB0aGUgY2FtZXJhIHVwLCBhY2NlcHRzIGEgbnVtZXJpYyBwYXJhbWV0ZXIgbmFtZWQgYG1vdmVSYXRlYCB0aGF0IGNvbnRyb2xzXHJcbiAgICogdGhlIGZhY3RvciBvZiBtb3ZlbWVudCwgYWNjb3JkaW5nIHRvIHRoZSBjYW1lcmEgaGVpZ2h0LlxyXG4gICAqL1xyXG4gIFtLZXlib2FyZEFjdGlvbi5DQU1FUkFfVVBdOiAoY2VzaXVtU2VydmljZTogQ2VzaXVtU2VydmljZSwgcGFyYW1zOiBhbnkpID0+IHtcclxuICAgIGNvbnN0IGNhbWVyYSA9IGNlc2l1bVNlcnZpY2UuZ2V0Vmlld2VyKCkuY2FtZXJhO1xyXG4gICAgY29uc3Qgc2NlbmUgPSBjZXNpdW1TZXJ2aWNlLmdldFNjZW5lKCk7XHJcbiAgICBjb25zdCBjYW1lcmFIZWlnaHQgPSBzY2VuZS5nbG9iZS5lbGxpcHNvaWQuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoY2FtZXJhLnBvc2l0aW9uKS5oZWlnaHQ7XHJcbiAgICBjb25zdCBtb3ZlUmF0ZSA9IGNhbWVyYUhlaWdodCAvIChwYXJhbXMubW92ZVJhdGUgfHwgQ0FNRVJBX01PVkVNRU5UX0RFRkFVTFRfRkFDVE9SKTtcclxuICAgIGNhbWVyYS5tb3ZlVXAobW92ZVJhdGUpO1xyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogTW92ZXMgdGhlIGNhbWVyYSBkb3duLCBhY2NlcHRzIGEgbnVtZXJpYyBwYXJhbWV0ZXIgbmFtZWQgYG1vdmVSYXRlYCB0aGF0IGNvbnRyb2xzXHJcbiAgICogdGhlIGZhY3RvciBvZiBtb3ZlbWVudCwgYWNjb3JkaW5nIHRvIHRoZSBjYW1lcmEgaGVpZ2h0LlxyXG4gICAqL1xyXG4gIFtLZXlib2FyZEFjdGlvbi5DQU1FUkFfRE9XTl06IChjZXNpdW1TZXJ2aWNlOiBDZXNpdW1TZXJ2aWNlLCBwYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgY2FtZXJhID0gY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKS5jYW1lcmE7XHJcbiAgICBjb25zdCBzY2VuZSA9IGNlc2l1bVNlcnZpY2UuZ2V0U2NlbmUoKTtcclxuICAgIGNvbnN0IGNhbWVyYUhlaWdodCA9IHNjZW5lLmdsb2JlLmVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhjYW1lcmEucG9zaXRpb24pLmhlaWdodDtcclxuICAgIGNvbnN0IG1vdmVSYXRlID0gY2FtZXJhSGVpZ2h0IC8gKHBhcmFtcy5tb3ZlUmF0ZSB8fCBDQU1FUkFfTU9WRU1FTlRfREVGQVVMVF9GQUNUT1IpO1xyXG4gICAgY2FtZXJhLm1vdmVEb3duKG1vdmVSYXRlKTtcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIE1vdmVzIHRoZSBjYW1lcmEgcmlnaHQsIGFjY2VwdHMgYSBudW1lcmljIHBhcmFtZXRlciBuYW1lZCBgbW92ZVJhdGVgIHRoYXQgY29udHJvbHNcclxuICAgKiB0aGUgZmFjdG9yIG9mIG1vdmVtZW50LCBhY2NvcmRpbmcgdG8gdGhlIGNhbWVyYSBoZWlnaHQuXHJcbiAgICovXHJcbiAgW0tleWJvYXJkQWN0aW9uLkNBTUVSQV9SSUdIVF06IChjZXNpdW1TZXJ2aWNlOiBDZXNpdW1TZXJ2aWNlLCBwYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgY2FtZXJhID0gY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKS5jYW1lcmE7XHJcbiAgICBjb25zdCBzY2VuZSA9IGNlc2l1bVNlcnZpY2UuZ2V0U2NlbmUoKTtcclxuICAgIGNvbnN0IGNhbWVyYUhlaWdodCA9IHNjZW5lLmdsb2JlLmVsbGlwc29pZC5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhjYW1lcmEucG9zaXRpb24pLmhlaWdodDtcclxuICAgIGNvbnN0IG1vdmVSYXRlID0gY2FtZXJhSGVpZ2h0IC8gKHBhcmFtcy5tb3ZlUmF0ZSB8fCBDQU1FUkFfTU9WRU1FTlRfREVGQVVMVF9GQUNUT1IpO1xyXG4gICAgY2FtZXJhLm1vdmVSaWdodChtb3ZlUmF0ZSk7XHJcbiAgfSxcclxuICAvKipcclxuICAgKiBNb3ZlcyB0aGUgY2FtZXJhIGxlZnQsIGFjY2VwdHMgYSBudW1lcmljIHBhcmFtZXRlciBuYW1lZCBgbW92ZVJhdGVgIHRoYXQgY29udHJvbHNcclxuICAgKiB0aGUgZmFjdG9yIG9mIG1vdmVtZW50LCBhY2NvcmRpbmcgdG8gdGhlIGNhbWVyYSBoZWlnaHQuXHJcbiAgICovXHJcbiAgW0tleWJvYXJkQWN0aW9uLkNBTUVSQV9MRUZUXTogKGNlc2l1bVNlcnZpY2U6IENlc2l1bVNlcnZpY2UsIHBhcmFtczogYW55KSA9PiB7XHJcbiAgICBjb25zdCBjYW1lcmEgPSBjZXNpdW1TZXJ2aWNlLmdldFZpZXdlcigpLmNhbWVyYTtcclxuICAgIGNvbnN0IHNjZW5lID0gY2VzaXVtU2VydmljZS5nZXRTY2VuZSgpO1xyXG4gICAgY29uc3QgY2FtZXJhSGVpZ2h0ID0gc2NlbmUuZ2xvYmUuZWxsaXBzb2lkLmNhcnRlc2lhblRvQ2FydG9ncmFwaGljKGNhbWVyYS5wb3NpdGlvbikuaGVpZ2h0O1xyXG4gICAgY29uc3QgbW92ZVJhdGUgPSBjYW1lcmFIZWlnaHQgLyAocGFyYW1zLm1vdmVSYXRlIHx8IENBTUVSQV9NT1ZFTUVOVF9ERUZBVUxUX0ZBQ1RPUik7XHJcbiAgICBjYW1lcmEubW92ZUxlZnQobW92ZVJhdGUpO1xyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogQ2hhbmdlcyB0aGUgY2FtZXJhIHRvIGxvb2sgdG8gdGhlIHJpZ2h0LCBhY2NlcHRzIGEgbnVtZXJpYyBwYXJhbWV0ZXIgbmFtZWQgYGxvb2tGYWN0b3JgIHRoYXQgY29udHJvbHNcclxuICAgKiB0aGUgZmFjdG9yIG9mIGxvb2tpbmcsIGFjY29yZGluZyB0byB0aGUgY2FtZXJhIGN1cnJlbnQgcG9zaXRpb24uXHJcbiAgICovXHJcbiAgW0tleWJvYXJkQWN0aW9uLkNBTUVSQV9MT09LX1JJR0hUXTogKGNlc2l1bVNlcnZpY2U6IENlc2l1bVNlcnZpY2UsIHBhcmFtczogYW55KSA9PiB7XHJcbiAgICBjb25zdCBjYW1lcmEgPSBjZXNpdW1TZXJ2aWNlLmdldFZpZXdlcigpLmNhbWVyYTtcclxuICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9IGNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYztcclxuICAgIGNvbnN0IGxvb2tGYWN0b3IgPSBwYXJhbXMubG9va0ZhY3RvciB8fCBDQU1FUkFfTE9PS19ERUZBVUxUX0ZBQ1RPUjtcclxuICAgIGNhbWVyYS5sb29rUmlnaHQoY3VycmVudFBvc2l0aW9uLmxhdGl0dWRlICogbG9va0ZhY3Rvcik7XHJcbiAgfSxcclxuICAvKipcclxuICAgKiBDaGFuZ2VzIHRoZSBjYW1lcmEgdG8gbG9vayB0byB0aGUgbGVmdCwgYWNjZXB0cyBhIG51bWVyaWMgcGFyYW1ldGVyIG5hbWVkIGBsb29rRmFjdG9yYCB0aGF0IGNvbnRyb2xzXHJcbiAgICogdGhlIGZhY3RvciBvZiBsb29raW5nLCBhY2NvcmRpbmcgdG8gdGhlIGNhbWVyYSBjdXJyZW50IHBvc2l0aW9uLlxyXG4gICAqL1xyXG4gIFtLZXlib2FyZEFjdGlvbi5DQU1FUkFfTE9PS19MRUZUXTogKGNlc2l1bVNlcnZpY2U6IENlc2l1bVNlcnZpY2UsIHBhcmFtczogYW55KSA9PiB7XHJcbiAgICBjb25zdCBjYW1lcmEgPSBjZXNpdW1TZXJ2aWNlLmdldFZpZXdlcigpLmNhbWVyYTtcclxuICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9IGNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYztcclxuICAgIGNvbnN0IGxvb2tGYWN0b3IgPSBwYXJhbXMubG9va0ZhY3RvciB8fCBDQU1FUkFfTE9PS19ERUZBVUxUX0ZBQ1RPUjtcclxuICAgIGNhbWVyYS5sb29rTGVmdChjdXJyZW50UG9zaXRpb24ubGF0aXR1ZGUgKiBsb29rRmFjdG9yKTtcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIENoYW5nZXMgdGhlIGNhbWVyYSB0byBsb29rIHVwLCBhY2NlcHRzIGEgbnVtZXJpYyBwYXJhbWV0ZXIgbmFtZWQgYGxvb2tGYWN0b3JgIHRoYXQgY29udHJvbHNcclxuICAgKiB0aGUgZmFjdG9yIG9mIGxvb2tpbmcsIGFjY29yZGluZyB0byB0aGUgY2FtZXJhIGN1cnJlbnQgcG9zaXRpb24uXHJcbiAgICovXHJcbiAgW0tleWJvYXJkQWN0aW9uLkNBTUVSQV9MT09LX1VQXTogKGNlc2l1bVNlcnZpY2U6IENlc2l1bVNlcnZpY2UsIHBhcmFtczogYW55KSA9PiB7XHJcbiAgICBjb25zdCBjYW1lcmEgPSBjZXNpdW1TZXJ2aWNlLmdldFZpZXdlcigpLmNhbWVyYTtcclxuICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9IGNhbWVyYS5wb3NpdGlvbkNhcnRvZ3JhcGhpYztcclxuICAgIGNvbnN0IGxvb2tGYWN0b3IgPSBwYXJhbXMubG9va0ZhY3RvciB8fCBDQU1FUkFfTE9PS19ERUZBVUxUX0ZBQ1RPUjtcclxuICAgIGNhbWVyYS5sb29rVXAoY3VycmVudFBvc2l0aW9uLmxvbmdpdHVkZSAqIChsb29rRmFjdG9yICogLTEpKTtcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIENoYW5nZXMgdGhlIGNhbWVyYSB0byBsb29rIGRvd24sIGFjY2VwdHMgYSBudW1lcmljIHBhcmFtZXRlciBuYW1lZCBgbG9va0ZhY3RvcmAgdGhhdCBjb250cm9sc1xyXG4gICAqIHRoZSBmYWN0b3Igb2YgbG9va2luZywgYWNjb3JkaW5nIHRvIHRoZSBjYW1lcmEgY3VycmVudCBwb3NpdGlvbi5cclxuICAgKi9cclxuICBbS2V5Ym9hcmRBY3Rpb24uQ0FNRVJBX0xPT0tfRE9XTl06IChjZXNpdW1TZXJ2aWNlOiBDZXNpdW1TZXJ2aWNlLCBwYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgY2FtZXJhID0gY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKS5jYW1lcmE7XHJcbiAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPSBjYW1lcmEucG9zaXRpb25DYXJ0b2dyYXBoaWM7XHJcbiAgICBjb25zdCBsb29rRmFjdG9yID0gcGFyYW1zLmxvb2tGYWN0b3IgfHwgQ0FNRVJBX0xPT0tfREVGQVVMVF9GQUNUT1I7XHJcbiAgICBjYW1lcmEubG9va0Rvd24oY3VycmVudFBvc2l0aW9uLmxvbmdpdHVkZSAqIChsb29rRmFjdG9yICogLTEpKTtcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFR3aXN0cyB0aGUgY2FtZXJhIHRvIHRoZSByaWdodCwgYWNjZXB0cyBhIG51bWVyaWMgcGFyYW1ldGVyIG5hbWVkIGBhbW91bnRgIHRoYXQgY29udHJvbHNcclxuICAgKiB0aGUgdHdpc3QgYW1vdW50XHJcbiAgICovXHJcbiAgW0tleWJvYXJkQWN0aW9uLkNBTUVSQV9UV0lTVF9SSUdIVF06IChjZXNpdW1TZXJ2aWNlOiBDZXNpdW1TZXJ2aWNlLCBwYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgY2FtZXJhID0gY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKS5jYW1lcmE7XHJcbiAgICBjb25zdCBsb29rRmFjdG9yID0gcGFyYW1zLmFtb3VudCB8fCBDQU1FUkFfVFdJU1RfREVGQVVMVF9GQUNUT1I7XHJcbiAgICBjYW1lcmEudHdpc3RSaWdodChsb29rRmFjdG9yKTtcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFR3aXN0cyB0aGUgY2FtZXJhIHRvIHRoZSBsZWZ0LCBhY2NlcHRzIGEgbnVtZXJpYyBwYXJhbWV0ZXIgbmFtZWQgYGFtb3VudGAgdGhhdCBjb250cm9sc1xyXG4gICAqIHRoZSB0d2lzdCBhbW91bnRcclxuICAgKi9cclxuICBbS2V5Ym9hcmRBY3Rpb24uQ0FNRVJBX1RXSVNUX0xFRlRdOiAoY2VzaXVtU2VydmljZTogQ2VzaXVtU2VydmljZSwgcGFyYW1zOiBhbnkpID0+IHtcclxuICAgIGNvbnN0IGNhbWVyYSA9IGNlc2l1bVNlcnZpY2UuZ2V0Vmlld2VyKCkuY2FtZXJhO1xyXG4gICAgY29uc3QgbG9va0ZhY3RvciA9IHBhcmFtcy5hbW91bnQgfHwgQ0FNRVJBX1RXSVNUX0RFRkFVTFRfRkFDVE9SO1xyXG4gICAgY2FtZXJhLnR3aXN0TGVmdChsb29rRmFjdG9yKTtcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFJvdGF0ZXMgdGhlIGNhbWVyYSB0byB0aGUgcmlnaHQsIGFjY2VwdHMgYSBudW1lcmljIHBhcmFtZXRlciBuYW1lZCBgYW5nbGVgIHRoYXQgY29udHJvbHNcclxuICAgKiB0aGUgcm90YXRpb24gYW5nbGVcclxuICAgKi9cclxuICBbS2V5Ym9hcmRBY3Rpb24uQ0FNRVJBX1JPVEFURV9SSUdIVF06IChjZXNpdW1TZXJ2aWNlOiBDZXNpdW1TZXJ2aWNlLCBwYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgY2FtZXJhID0gY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKS5jYW1lcmE7XHJcbiAgICBjb25zdCBsb29rRmFjdG9yID0gcGFyYW1zLmFuZ2xlIHx8IENBTUVSQV9ST1RBVEVfREVGQVVMVF9GQUNUT1I7XHJcbiAgICBjYW1lcmEucm90YXRlUmlnaHQobG9va0ZhY3Rvcik7XHJcbiAgfSxcclxuICAvKipcclxuICAgKiBSb3RhdGVzIHRoZSBjYW1lcmEgdG8gdGhlIGxlZnQsIGFjY2VwdHMgYSBudW1lcmljIHBhcmFtZXRlciBuYW1lZCBgYW5nbGVgIHRoYXQgY29udHJvbHNcclxuICAgKiB0aGUgcm90YXRpb24gYW5nbGVcclxuICAgKi9cclxuICBbS2V5Ym9hcmRBY3Rpb24uQ0FNRVJBX1JPVEFURV9MRUZUXTogKGNlc2l1bVNlcnZpY2U6IENlc2l1bVNlcnZpY2UsIHBhcmFtczogYW55KSA9PiB7XHJcbiAgICBjb25zdCBjYW1lcmEgPSBjZXNpdW1TZXJ2aWNlLmdldFZpZXdlcigpLmNhbWVyYTtcclxuICAgIGNvbnN0IGxvb2tGYWN0b3IgPSBwYXJhbXMuYW5nbGUgfHwgQ0FNRVJBX1JPVEFURV9ERUZBVUxUX0ZBQ1RPUjtcclxuICAgIGNhbWVyYS5yb3RhdGVMZWZ0KGxvb2tGYWN0b3IpO1xyXG4gIH0sXHJcbiAgLyoqXHJcbiAgICogUm90YXRlcyB0aGUgY2FtZXJhIHVwd2FyZHMsIGFjY2VwdHMgYSBudW1lcmljIHBhcmFtZXRlciBuYW1lZCBgYW5nbGVgIHRoYXQgY29udHJvbHNcclxuICAgKiB0aGUgcm90YXRpb24gYW5nbGVcclxuICAgKi9cclxuICBbS2V5Ym9hcmRBY3Rpb24uQ0FNRVJBX1JPVEFURV9VUF06IChjZXNpdW1TZXJ2aWNlOiBDZXNpdW1TZXJ2aWNlLCBwYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgY2FtZXJhID0gY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKS5jYW1lcmE7XHJcbiAgICBjb25zdCBsb29rRmFjdG9yID0gcGFyYW1zLmFuZ2xlIHx8IENBTUVSQV9ST1RBVEVfREVGQVVMVF9GQUNUT1I7XHJcbiAgICBjYW1lcmEucm90YXRlVXAobG9va0ZhY3Rvcik7XHJcbiAgfSxcclxuICAvKipcclxuICAgKiBSb3RhdGVzIHRoZSBjYW1lcmEgZG93bndhcmRzLCBhY2NlcHRzIGEgbnVtZXJpYyBwYXJhbWV0ZXIgbmFtZWQgYGFuZ2xlYCB0aGF0IGNvbnRyb2xzXHJcbiAgICogdGhlIHJvdGF0aW9uIGFuZ2xlXHJcbiAgICovXHJcbiAgW0tleWJvYXJkQWN0aW9uLkNBTUVSQV9ST1RBVEVfRE9XTl06IChjZXNpdW1TZXJ2aWNlOiBDZXNpdW1TZXJ2aWNlLCBwYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgY29uc3QgY2FtZXJhID0gY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKS5jYW1lcmE7XHJcbiAgICBjb25zdCBsb29rRmFjdG9yID0gcGFyYW1zLmFuZ2xlIHx8IENBTUVSQV9ST1RBVEVfREVGQVVMVF9GQUNUT1I7XHJcbiAgICBjYW1lcmEucm90YXRlRG93bihsb29rRmFjdG9yKTtcclxuICB9LFxyXG4gIC8qKlxyXG4gICAqIFpvb20gaW4gaW50byB0aGUgY3VycmVudCBjYW1lcmEgY2VudGVyIHBvc2l0aW9uLCBhY2NlcHRzIGEgbnVtZXJpYyBwYXJhbWV0ZXIgbmFtZWRcclxuICAgKiBgYW1vdW50YCB0aGF0IGNvbnRyb2xzIHRoZSBhbW91bnQgb2Ygem9vbSBpbiBtZXRlcnMuXHJcbiAgICovXHJcbiAgW0tleWJvYXJkQWN0aW9uLkNBTUVSQV9aT09NX0lOXTogKGNlc2l1bVNlcnZpY2U6IENlc2l1bVNlcnZpY2UsIHBhcmFtczogYW55KSA9PiB7XHJcbiAgICBjb25zdCBjYW1lcmEgPSBjZXNpdW1TZXJ2aWNlLmdldFZpZXdlcigpLmNhbWVyYTtcclxuICAgIGNvbnN0IGFtb3VudCA9IHBhcmFtcy5hbW91bnQ7XHJcbiAgICBjYW1lcmEuem9vbUluKGFtb3VudCk7XHJcbiAgfSxcclxuICAvKipcclxuICAgKiBab29tIG91dCBmcm9tIHRoZSBjdXJyZW50IGNhbWVyYSBjZW50ZXIgcG9zaXRpb24sIGFjY2VwdHMgYSBudW1lcmljIHBhcmFtZXRlciBuYW1lZFxyXG4gICAqIGBhbW91bnRgIHRoYXQgY29udHJvbHMgdGhlIGFtb3VudCBvZiB6b29tIGluIG1ldGVycy5cclxuICAgKi9cclxuICBbS2V5Ym9hcmRBY3Rpb24uQ0FNRVJBX1pPT01fT1VUXTogKGNlc2l1bVNlcnZpY2U6IENlc2l1bVNlcnZpY2UsIHBhcmFtczogYW55KSA9PiB7XHJcbiAgICBjb25zdCBjYW1lcmEgPSBjZXNpdW1TZXJ2aWNlLmdldFZpZXdlcigpLmNhbWVyYTtcclxuICAgIGNvbnN0IGFtb3VudCA9IHBhcmFtcy5hbW91bnQ7XHJcbiAgICBjYW1lcmEuem9vbU91dChhbW91bnQpO1xyXG4gIH0sXHJcbn07XHJcbiJdfQ==